home *** CD-ROM | disk | FTP | other *** search
- # Written by Bram Cohen
- # see LICENSE.txt for license information
-
- from time import time
-
- class DownloaderFeedback:
- def __init__(self, choker, add_task, statusfunc, upfunc, downfunc, uptotal, downtotal,
- remainingfunc, leftfunc, file_length, finflag, interval, spewflag):
- self.choker = choker
- self.add_task = add_task
- self.statusfunc = statusfunc
- self.upfunc = upfunc
- self.downfunc = downfunc
- self.uptotal = uptotal
- self.downtotal = downtotal
- self.remainingfunc = remainingfunc
- self.leftfunc = leftfunc
- self.file_length = file_length
- self.finflag = finflag
- self.interval = interval
- self.spewflag = spewflag
- self.lastids = []
- self.display()
-
- def _rotate(self):
- cs = self.choker.connections
- for id in self.lastids:
- for i in xrange(len(cs)):
- if cs[i].get_id() == id:
- return cs[i:] + cs[:i]
- return cs
-
- def collect_spew(self):
- l = [ ]
- cs = self._rotate()
- self.lastids = [c.get_id() for c in cs]
- for c in cs:
- rec = {}
- rec["ip"] = c.get_ip()
- if c is self.choker.connections[0]:
- rec["is_optimistic_unchoke"] = 1
- else:
- rec["is_optimistic_unchoke"] = 0
- if c.is_locally_initiated():
- rec["initiation"] = "local"
- else:
- rec["initiation"] = "remote"
- u = c.get_upload()
- rec["upload"] = (int(u.measure.get_rate()), u.is_interested(), u.is_choked())
-
- d = c.get_download()
- rec["download"] = (int(d.measure.get_rate()), d.is_interested(), d.is_choked(), d.is_snubbed())
-
- l.append(rec)
- return l
-
- def display(self):
- self.add_task(self.display, self.interval)
- spew = []
- if self.finflag.isSet():
- status = {"upRate" : self.upfunc(), "upTotal" : self.uptotal() / 1048576.0}
- if self.spewflag.isSet():
- status['spew'] = self.collect_spew()
- self.statusfunc(status)
- return
- timeEst = self.remainingfunc()
-
- if self.file_length > 0:
- fractionDone = (self.file_length - self.leftfunc()) / float(self.file_length)
- else:
- fractionDone = 1
- status = {
- "fractionDone" : fractionDone,
- "downRate" : self.downfunc(),
- "upRate" : self.upfunc(),
- "upTotal" : self.uptotal() / 1048576.0,
- "downTotal" : self.downtotal() / 1048576.0
- }
- if timeEst is not None:
- status['timeEst'] = timeEst
- if self.spewflag.isSet():
- status['spew'] = self.collect_spew()
- self.statusfunc(status)
-